package com.bookocean.domain.repository;

import com.bookocean.controller.dto.FavoriteDto;
import com.bookocean.controller.dto.PageResultDto;

/**
 * 书摘收藏仓储接口
 * 
 * @author BookOcean
 * @since 2024-01-01
 */
public interface BookFavoriteRepository {

    /**
     * 创建收藏
     * 
     * @param quoteId 书摘ID
     * @param userId 用户ID
     */
    void createFavorite(Long quoteId, Long userId);

    /**
     * 删除收藏
     * 
     * @param quoteId 书摘ID
     * @param userId 用户ID
     */
    void deleteByQuoteIdAndUserId(Long quoteId, Long userId);

    /**
     * 检查用户是否已收藏
     * 
     * @param quoteId 书摘ID
     * @param userId 用户ID
     * @return 是否已收藏
     */
    boolean existsByQuoteIdAndUserId(Long quoteId, Long userId);

    /**
     * 获取书摘收藏数量
     * 
     * @param quoteId 书摘ID
     * @return 收藏数量
     */
    Integer getFavoriteCount(Long quoteId);
    
    // ========== 通用互动方法（支持书摘、小说、章节） ==========

    /**
     * 收藏（通用方法）
     * 
     * @param targetId 目标ID
     * @param targetType 目标类型（1-书摘，2-小说，3-章节）
     * @param userId 用户ID
     */
    void favorite(Long targetId, Integer targetType, Long userId);

    /**
     * 取消收藏（通用方法）
     * 
     * @param targetId 目标ID
     * @param targetType 目标类型（1-书摘，2-小说，3-章节）
     * @param userId 用户ID
     */
    void unfavorite(Long targetId, Integer targetType, Long userId);

    /**
     * 检查用户是否已收藏（通用方法）
     * 
     * @param targetId 目标ID
     * @param targetType 目标类型（1-书摘，2-小说，3-章节）
     * @param userId 用户ID
     * @return 是否已收藏
     */
    boolean isFavoritedByUser(Long targetId, Integer targetType, Long userId);

    /**
     * 获取目标收藏数量（通用方法）
     * 
     * @param targetId 目标ID
     * @param targetType 目标类型（1-书摘，2-小说，3-章节）
     * @return 收藏数量
     */
    Integer countByTarget(Long targetId, Integer targetType);

    /**
     * 获取用户收藏列表
     * 
     * @param userId 用户ID
     * @param targetType 目标类型（可选）
     * @param page 页码
     * @param pageSize 每页数量
     * @return 分页收藏列表
     */
    PageResultDto<FavoriteDto> getUserFavorites(Long userId, Integer targetType, Integer page, Integer pageSize);
}
